package com.glela.goods.mapper;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.glela.es.model.GoodsForES;
import com.glela.goods.model.Goods;
import com.glela.goods.model.GoodsNew;
import com.glela.goods.model.Inventory;
import com.glela.goods.model.LimitTimeGoodsPrice;
import com.glela.goods.model.LimitTimeSaleDetail;
import com.glela.goods.model.vo.InventoryVo;
import com.glela.goods.model.vo.goods.GoodSerialVo;
import com.glela.goods.model.vo.goods.GoodsSimpleVo;

public interface GoodsMapper {

	public InventoryVo selectInventoryById(long inventoryId);

	/**
	 * 查询商品根据id查询(在有效的上下线时间范围内)
	 * 
	 * @author houmf
	 * @param id
	 * @return
	 */
	public Goods selectGoodsById(long id);

	/**
	 * 查询商品根据id查询(无条件)
	 * 
	 * @author houmf
	 * @param id
	 * @return
	 */
	public Goods selectGoodsByIdTwo(long id);
	
	public Goods selectGoodsByIdForAll(long id);

	/**
	 * 查询商品根据id查询(冗余商品信息)
	 * 
	 * @author houmf
	 * @param id
	 * @return
	 */
	public Goods selectGoodsByIdNoDateTime(long id);

	/**
	 * 查询所有商品个数
	 * 
	 * @author houmf
	 * @return
	 */
	public int selectGoodsCount();

	/**
	 * 查询所有商品 分页
	 * 
	 * @author houmf
	 * @param pagelimit，pageSize
	 * @return
	 */
	public List<Goods> selectGoodsList(@Param("pagelimit") int pagelimit, @Param("pageSize") int pageSize);

	/**
	 * 根据子分类查询总数
	 * 
	 * @param categoryId
	 * @return
	 */
	public List<Goods> selectGoodsByCategoryIdCount(@Param("categoryId") int categoryId,
			@Param("list") List<Integer> brandIdList, @Param("goodsIdList") List<Long> goodsIdList);

	/**
	 * 根据子分类查询分页
	 * 
	 * @param pagelimit
	 * @param pageSize
	 * @param categoryId
	 * @param brandIdList
	 * @param sort
	 *            排序列
	 * @param order
	 *            排序方式
	 * @return
	 */
	public List<Goods> selectGoodsListByCategoryId(@Param("pagelimit") int pagelimit, @Param("pageSize") int pageSize,
			@Param("categoryId") int categoryId, @Param("list") List<Integer> brandIdList, @Param("sort") String sort,
			@Param("order") String order, @Param("goodsIdList") List<Long> goodsIdList);

	/**
	 * 根据子分类id查询所有商品 中不重复的 品牌id
	 * 
	 * @param categoryId
	 * @return
	 */
	public List<Integer> selectBrandIdListByCategoryId(int categoryId);

	/**
	 * 根据品牌id查询分页
	 * 
	 * @param pagelimit
	 * @param pageSize
	 * @param brandId
	 * @return
	 */
	public List<Goods> selectGoodsListByBrandIdAndGoodsIdList(@Param("brandId") int brandId,
			@Param("goodsIdList") List<Long> goodsIdList, @Param("pagelimit") int pagelimit,
			@Param("pageSize") int pageSize);

	public List<Goods> selectGoodsListByBrandIdAndGoodsIdListNum(@Param("brandId") int brandId,
			@Param("goodsIdList") List<Long> goodsIdList);

	/**
	 * 查询商品列表，根据IN 多个id
	 * 
	 * @author 卫耀华
	 * @date 2016-10-20 15:44
	 * @param idList
	 */
	public List<Goods> selectGoodsByIdList(@Param("idList") List<Long> idList);
	/***
	 * 
	 * @param goodsIdList : 产品ID列表 
	 * @param roleId : 店主角色ID
	 * @return
	 */
	public List<Inventory> selectPriceForGoods(@Param("goodsIdList") List<Long> goodsIdList , @Param("roleId") long roleId);
	/****
	 * 
	 * @param goodsIdList : 
	 * @return
	 */
	public List<LimitTimeSaleDetail> selectLimitSalePriceList( @Param("goodsIdList") List<Long> goodsIdList );

	public List<LimitTimeSaleDetail> selectLimitSalePriceListByGidsAndEndDate(@Param("goodsIdList") List<Long> goodsIdList, @Param("endDate") Date endDate);
	
	
	

	public List<Goods> selectGoodsByIdListTeacher1(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher2(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher3(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher4(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher5(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher6(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher7(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher8(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher9(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	public List<Goods> selectGoodsByIdListTeacher10(@Param("idList") List<Long> idList,
			@Param("teacherId") long teacherId);

	/**
	 * 首页热销单品需要
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public List<Long> selectHotSaleLimit40();

	/**
	 * 首页热销单品需要
	 * 
	 * @author 卫耀华
	 * @param idList
	 * @param pagelimit
	 * @param pageSize
	 * @return
	 */
	public List<GoodsSimpleVo> selectGoodsHotSales(@Param("idList") List<Long> idList,
			@Param("pageLimit") int pageLimit, @Param("pageSize") int pageSize);

	/**
	 * 首页热销单品需要
	 * 
	 * @author 卫耀华
	 * @param idList
	 * @return
	 */
	public List<GoodsSimpleVo> countGoodsHotSales(@Param("idList") List<Long> idList);

	/**
	 * 首页搜索商品分页
	 * 
	 * @author 卫耀华
	 * @param searchKeyWord
	 * @param startIndex
	 * @param pageSize
	 * @return
	 */
	public List<Goods> selectGoodsByNameAndLabelNameLike(@Param("searchKeyWord") String searchKeyWord,
			@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);

	public List<Long> selectGoodsIdListByBrandId(@Param("brandId") int brandId);

	/**
	 * 校妆APP内讲师店铺只显示B端商品
	 * 
	 * @author 卫耀华
	 * @param idList
	 * @return
	 */
	public List<Goods> selectGoodsType1ByIdList(@Param("idList") List<Long> idList);

	/**
	 * 校妆APP内讲师店铺讲师推荐商品分页列表
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public List<Goods> selectGoodsType1ByIdListPage(@Param("idList") List<Long> idList,
			@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);

	/**
	 * 校妆APP内讲师店铺讲师推荐商品分页列表
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public List<Long> selectJiangshiGoodsIdList();

	/**
	 * 只返回福利社商品，根据IN 多个id
	 * 
	 * @author 卫耀华
	 * @date 2016-12-20 17:44
	 * @param idList
	 */
	public List<Goods> selectFuLiSheGoodsByIdList(@Param("idList") List<Long> idList);

	/**
	 * 查询商品列表，根据IN 多个id
	 * 
	 * @author 卫耀华
	 * @date 2016-10-20 15:44
	 * @param idList
	 */
	public List<Goods> selectGoodsByIdListForSerialDetail(@Param("idList") List<Long> idList);

	/**
	 * 查询所有的B区商品1
	 * 
	 * @return
	 */
	public List<Goods> selectGoodsGoodsType();

	/**
	 * 查询所有的B区商品2
	 * 
	 * @return
	 */
	public List<Goods> selectGoodsGoodsType1();

	/**
	 * 查询所有的B区商品3
	 * 
	 * @return
	 */
	public List<Goods> selectGoodsGoodsType2();

	/**
	 * B区商品
	 * 
	 * @return
	 */
	public List<Goods> selectGoodsGoodsTypeAll(@Param("page") int page, @Param("pageSize") int pageSize);

	/**
	 * B区商品价格正序
	 * 
	 * @return
	 */
	public List<Goods> selectGoodsGoodsTypeAllAsc(@Param("page") int page, @Param("pageSize") int pageSize);

	/**
	 * B区商品价格倒叙
	 * 
	 * @return
	 */
	public List<Goods> selectGoodsGoodsTypeAllDesc(@Param("page") int page, @Param("pageSize") int pageSize);

	public int selectGoodsGoodsTypeAllCount();

	public List<Goods> selectGoodsSearch(@Param("labelName") String labelName, @Param("page") int page,
			@Param("pageSize") int pageSize);

	public int selectGoodsSearchCount(String labelName);

	public List<Goods> selectGoodsType1ByIdList1();

	public List<Goods> selectGoodsType1ByIdList2();

	public List<Goods> selectGoodsType1ByIdList3();

	public List<Goods> selectGoodsType1ByIdList4();

	public List<Goods> selectGoodsType1ByIdList5();

	public List<Goods> selectGoodsType1ByIdList6();

	public List<Goods> selectGoodsType1ByIdList7();

	public List<Goods> selectGoodsType1ByIdList8();

	public List<Goods> selectGoodsType1ByIdList9();

	public List<Goods> selectGoodsType1ByIdList10();

	public List<Goods> selectListGoodsNew(@Param("page") int page, @Param("pageSize") int pageSize);

	public int selectListGoodsNewCount();

	/**
	 * ES同步数据用途--只是C区
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public List<GoodsForES> selectAllGoodsType0ForES();

	/**
	 * 校妆APP自动同步所有B区商品到ES
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public List<GoodsForES> selectAllGoodsType1ForES();

	/**
	 * 根据子分类ID查询商品列表--分页
	 * 
	 * @author 卫耀华
	 * @param categoryId
	 * @param brandIdList
	 * @param order
	 * @param startIndex
	 * @param pageSize
	 * @return
	 */
	public List<GoodsSimpleVo> listGoodsPageByCategoryId(@Param("categoryId") int categoryId,
			@Param("brandIdList") List<Integer> brandIdList, @Param("order") String order,
			@Param("startIndex") int startIndex, @Param("pageSize") Integer pageSize);

	/**
	 * 根据子分类ID查询商品列表--分页count
	 * 
	 * @author 卫耀华
	 * @param categoryId
	 * @param brandIdList
	 * @return
	 */
	public List<GoodsSimpleVo> countGoodsByCategoryId(@Param("categoryId") int categoryId,
			@Param("brandIdList") List<Integer> brandIdList);
	
	/**
	 * 
	* **********************************************
	* @Title: saveUpAndDownGoodsCount
	* @Description: 保存商品上下架次数
	* @param @param goodsId
	* @param @return    设定文件
	* @return int    返回类型
	* @throws		异常
	* @author NingChongQing		作者
	* @date 2017年7月10日 下午5:04:29		时间
	* **********************************************
	 */
	public int saveUpAndDownGoodsCount(@Param("goodsId")Integer goodsId,@Param("addCount")Integer addCount,@Param("subCount")Integer subCount);
	
	/**
	* **********************************************
	* @Title: selectNearlyLimitTimeSale
	* @Description: 查询距离当前最近的分时抢购活动信息
	* @param @param goodsId
	* @param @return    设定文件
	* @return Map<String,Object>    返回类型
	* @throws		异常
	* @author NingChongQing		作者
	 * @param nowTime 
	* @date 2017年7月10日 下午7:58:40		时间
	* **********************************************
	 */
	public Map<String,Object> selectNearlyLimitTimeSale(@Param("goodsId")long goodsId,@Param("productId")long productId,@Param("nowTime")String nowTime);
	
	/**
	* **********************************************
	* @Title: selectLimitTimeSale
	* @Description: 查询正在进行的分时抢购信息
	* @param @param id
	* @param @param productId
	* @param @return    设定文件
	* @return Map<String,Object>    返回类型
	* @throws		异常
	* @author NingChongQing		作者
	 * @param nowTime 
	* @date 2017年7月14日 下午1:32:49		时间
	* **********************************************
	 */
	public Map<String, Object> selectLimitTimeSale(@Param("goodsId")long goodsId,@Param("productId")long productId, @Param("nowTime") String nowTime);
	
	/**
	* **********************************************
	* @Title: getSpecificationImagesPath
	* @Description: 获取规格图片
	* @param @param goodId
	* @param @param specificationDetailId
	* @param @return    设定文件
	* @return String    返回类型
	* @throws		异常
	* @author NingChongQing		作者
	* @date 2017年7月14日 下午3:39:38		时间
	* **********************************************
	 */
	public String getSpecificationImagesPath(@Param("goodId")long goodId,@Param("specificationDetailId")int specificationDetailId);

	/**
	* @Title: selectOneGoodById
	* @Description:根据id查询商品
	* @param @param id
	* @param @return    参数
	* @return GoodSerialVo    返回类型
	* @throws
	* @author zhangrenjie
	* @date 2017年7月14日
	*/
	public GoodSerialVo selectOneGoodById(@Param("id")long id);
	

	/** 
	* @Title: updateByPrimaryKeySelective 
	* @Description: 更新商品横图访问地址
	* @param 
	* @param @return    设定文件 
	* @return int    返回类型 
	* @throws 
	* @author zhangrenjie 
	* @date 2017年7月26日 下午5:17:09 
	*/
	int updateWPicByPrimaryKeySelective(Goods record);
	
	/** 
	* @Title: selectGoodsByBN 
	* @Description: 通过商品编号查询商品信息
	* @param Bn 商品编号
	* @param @return    设定文件 
	* @return List<Goods>    返回类型 
	* @throws 
	* @author zhangrenjie 
	* @date 2017年7月26日 下午5:35:43 
	*/
	public List<Goods> selectGoodsByBN(@Param("bn")String Bn);
	
	/**
	* **********************************************
	* @Title: saveOpenAndShareCount
	* @Description: 保存打开与分享次数
	* @param @param goodsId
	* @param @param openCount
	* @param @param shareCount
	* @param @return    设定文件
	* @return int    返回类型
	* @throws		异常
	* @author NingChongQing		作者
	* @date 2017年7月17日 下午2:47:58		时间
	* **********************************************
	 */
	public int saveOpenAndShareCount(@Param("goodsId")Integer goodsId,@Param("openCount")Integer openCount,@Param("shareCount")Integer shareCount);
	
	public List<LimitTimeGoodsPrice> selectLimitTimeSalePrice(@Param("goodsIdList") Collection<Long> goodsIdList , @Param("roleId") long roleId , @Param("limitTimeSaleId") long limitTimeSaleId);

	//查询品牌馆商品列表
    public List<GoodSerialVo> selectGoodsListByBrandIdPage(@Param("brandId")int brandId, @Param("idList")List<Long> idList, @Param("startIndex")int startIndex, @Param("pageSize")int pageSize);

	public List<GoodSerialVo> selectOneGoodByIdList(@Param("id")long marketingActivitiesId, @Param("page")int page,@Param("pageSize") int pageSize);
	
	// 查询商品对应的素材信息（不分页）
	public List<Map<String, Object>> selectMaterialsByGoodsId(@Param("goodsId") long goodsId);
	// 查询素材赌赢的图片信息
	public List<Map<String, Object>> selectTitleDiscoverPicturesByTitleId(@Param("titleId") int titleId);
	// 查询商品对应的素材信息（分页）
	public List<Map<String, Object>> selectMaterialsByGoodsIdWithPage(@Param("goodsId") long goodsId,@Param("page") int page,@Param("pageSize") Integer pageSize);
	// 保存商品素材保存分享次数
	public void saveMaterialOpenAndShareCount(@Param("materialId") long materialId, @Param("saveCount") int saveCount, @Param("shareCount") int shareCount);
	// 根据商品ID集合查询商品明细列表
	public List<Goods> selectGoodsByIds(@Param("goodsIdList") List<Long> goodsIdList);

	/**
	 * 查询开店商品
	 * @param showAll 是否全部显示未到期开店商品
	 * @param nowDay 查询再此时间有效的商品
	 */
	public List<Goods> selectOpenStoreGoods(@Param("showAll") boolean showAll, @Param("nowDay") Date nowDay);
	/**
	 * @Description: 新增商品
	 * @Author: zhangrenjie
	 * @Date: 2018/1/31 22:17
	 *
	 */
    public void insertSelective(GoodsNew goods);
	/**
	 * @Description: 更新商品信息
	 * @Author: zhangrenjie
	 * @Date: 2018/2/1 14:08
	 *
	 */
	public void updateGoodsByPrimaryKeySelective(GoodsNew goods);
	
	/**
	 * 根据商品ID数组查询商品信息
	 */
	public List<Goods> selectAllGoodsByIdList(@Param("idList") List<Long> idList);

}
